const maxSlidingWindowDeque = function (nums, k) {
  // 缓存数组长度
  const len = nums.length;
  // 存储滑动窗口中每个窗口的最大值
  const res:Array<number> = [];
  // 使用双端队列来维护窗口内的最大值索引
  const deque:Array<number> = [];
  // 开始遍历数组nums
  for (let i = 0; i < len; i++) {
    // 当窗口滑动到超过k时，移除窗口左侧元素的索引
    // 如果双端队列的第一个元素对应的索引已经超出了当前窗口的范围（即不在当前窗口内），则从队列的头部移除该元素，以保持窗口的大小为k
    if (deque[0] < i - k + 1) {
      deque.shift();
    }

    // 当新元素大于队列尾部元素时，移除队列尾部元素，确保队列是单调递减的
    // 如果当前元素nums[i]大于等于队列尾部元素对应的值nums[deque[deque.length - 1]]，则从队列的尾部移除该元素，因为当前元素更大，它可能成为更后面的窗口的最大值
    while (deque.length && nums[i] >= nums[deque[deque.length - 1]]) {
      deque.pop();
    }

    deque.push(i); // 将当前元素的索引加入队列

    // 当窗口已经形成时，将窗口内的最大值推入结果数组
    // 如果当前元素的索引大于等于k - 1，表示当前窗口已经形成，则将窗口内的最大值
    if (i >= k - 1) {
      res.push(nums[deque[0]]);
    }
  }

  return res;
};
